/**
 * 金额格式化函数
 * @param {number|string} amount - 金额数值
 * @param {Object} [options] - 配置选项
 * @param {number} [options.decimals=2] - 保留小数位数
 * @param {string} [options.decimalPoint='.'] - 小数点符号
 * @param {string} [options.thousandsSep=','] - 千分位分隔符
 * @param {string} [options.symbol=''] - 货币符号（如¥/$）
 * @param {boolean} [options.symbolBefore=true] - 符号是否在数字前
 * @returns {string} 格式化后的金额字符串
 */
function formatMoney(
  amount,
  {
    decimals = 2,
    decimalPoint = ".",
    thousandsSep = ",",
    symbol = "",
    symbolBefore = true,
  } = {}
) {
  // 参数验证
  if (amount === null || amount === undefined || isNaN(Number(amount))) {
    throw new Error("Invalid amount value")
  }

  const num = Number(amount)
  const sign = num < 0 ? "-" : ""

  // 处理绝对值
  const absoluteValue = Math.abs(num)

  // 小数部分处理
  const decimalValue = (absoluteValue - Math.floor(absoluteValue)).toFixed(
    decimals
  )
  const decimalStr =
    decimals > 0 ? decimalPoint + decimalValue.split(".")[1] : ""

  // 整数部分处理（添加千分位分隔符）
  let integerStr = Math.floor(absoluteValue).toString()
  integerStr = integerStr.replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSep)

  // 组合结果
  const numberPart = sign + integerStr + decimalStr
  const symbolPart = symbol ? `${symbol}` : ""

  return symbolBefore
    ? `${symbolPart}${numberPart}`
    : `${numberPart}${symbolPart}`
}

// 使用示例
console.log(formatMoney(1234567.891)) // "1,234,567.89"
console.log(formatMoney(-1234.567, { decimals: 3 })) // "-1,234.567"
console.log(formatMoney(1234.5, { symbol: "¥" })) // "¥1,234.50"
console.log(formatMoney(1234.5, { symbol: "$", symbolBefore: false })) // "1,234.50$"
console.log(formatMoney("1234567", { thousandsSep: " " })) // "1 234 567.00"
